#include <../lib/igloo/igloo.h>
using namespace igloo;

#include <stdio.h>
#include <string>
using namespace std;

#include "../../Archivos/ArchivoDeEstructurasFijas.h"
#include "../../Entidades/Votante.h"
using namespace Archivos;
using namespace Entidades;
Context(TestVotante)
{

	ArchivoDeEstructurasFijas* archivo;
	string path;

	void SetUp() {

		path = "TestVotante.bin";
		archivo = new ArchivoDeEstructurasFijas(path,512);

		Votante* entidadInsertada = new Votante();
		entidadInsertada->setDNI(234567890);
		entidadInsertada->setClave(1234);
		entidadInsertada->setNombreYApellido("nombre y apellido test");
		entidadInsertada->setDomicilio("mi domicilio");
		entidadInsertada->setDistrito("test distrito!");
		Eleccion* eleccion1 = new Eleccion();
		eleccion1->setFecha(20110808);
		eleccion1->setCargo("cargo1");
		entidadInsertada->addEleccion(eleccion1);
		Eleccion* eleccion2 = new Eleccion();
		eleccion2->setFecha(20111213);
		eleccion2->setCargo("cargo2");
		entidadInsertada->addEleccion(eleccion2);
		archivo->insertar(entidadInsertada);
		delete entidadInsertada;
	}

	void TearDown() {

		remove(path.c_str());
		delete archivo;
	}

	Spec(TestLeer) {

		Votante* entidadLeida = new Votante();
		archivo->leer(entidadLeida, 0);

		Assert::That(entidadLeida->getDNI(), Is().EqualTo(234567890));
		Assert::That(entidadLeida->getClave(), Is().EqualTo(1234));
		Assert::That(entidadLeida->getNombreYApellido(), Is().EqualTo("nombre y apellido test"));
		Assert::That(entidadLeida->getDomicilio(), Is().EqualTo("mi domicilio"));
		Assert::That(entidadLeida->getDistrito()->getNombre(), Is().Containing("test distrito!"));
		Assert::That(entidadLeida->getElecciones()->size(), Is().EqualTo((unsigned int)2));

		if (entidadLeida->getElecciones()->size() == 2)
		{
			Assert::That(entidadLeida->getElecciones()->at(0)->getFecha(), Is().EqualTo(20110808));
			Assert::That(entidadLeida->getElecciones()->at(0)->getCargo()->getNombre(), Is().EqualTo("cargo1"));
			Assert::That(entidadLeida->getElecciones()->at(1)->getFecha(), Is().EqualTo(20111213));
			Assert::That(entidadLeida->getElecciones()->at(1)->getCargo()->getNombre(), Is().EqualTo("cargo2"));
		}

		delete entidadLeida;
	}

	Spec(TestBorrar) {

		Votante* entidadBorrada = new Votante();
		bool borradoExitoso = archivo->borrar(entidadBorrada, 0);
		delete entidadBorrada;

		Assert::That(borradoExitoso, Is().EqualTo(true));
	}

};

